#include <iostream>
using namespace std;

//普通实现页面

// //Java页面
// class Java
// {
// public:
//     void header()
//     {
//         cout << "首页、公开课、登陆、注册……（公共头部）" << endl;
//     }
//     void footer()
//     {
//         cout << "帮助中心、交流合作、站内地图……（公共底部）" << endl;
//     }
//     void left()
//     {
//         cout << "Java、Python、C++……（公共分类列表）" << endl;
//     }
//     void content()
//     {
//         cout << "Java学科视频" << endl;
//     }
// };

// //Python页面
// class Python
// {
// public:
//     void header()
//     {
//         cout << "首页、公开课、登陆、注册……（公共头部）" << endl;
//     }
//     void footer()
//     {
//         cout << "帮助中心、交流合作、站内地图……（公共底部）" << endl;
//     }
//     void left()
//     {
//         cout << "Java、Python、C++……（公共分类列表）" << endl;
//     }
//     void content()
//     {
//         cout << "Python学科视频" << endl;
//     }
// };

// //C页面
// class C
// {
// public:
//     void header()
//     {
//         cout << "首页、公开课、登陆、注册……（公共头部）" << endl;
//     }
//     void footer()
//     {
//         cout << "帮助中心、交流合作、站内地图……（公共底部）" << endl;
//     }
//     void left()
//     {
//         cout << "Java、Python、C++……（公共分类列表）" << endl;
//     }
//     void content()
//     {
//         cout << "C语言学科视频" << endl;
//     }
// };


//继承实现页面

//公共页面类
class BasePage
{
public:
    void header()
    {
        cout << "首页、公开课、登陆、注册……（公共头部）" << endl;
    }
    void footer()
    {
        cout << "帮助中心、交流合作、站内地图……（公共底部）" << endl;
    }
    void left()
    {
        cout << "Java、Python、C++……（公共分类列表）" << endl;
    }
};

//继承的好处：减少重复的代码
//语法：class 子类：继承方式 父类
//子类  派生类
//父类  基类

//Java页面
class Java:public BasePage//继承
{
public:
    void content()
    {
        cout << "Java学科视频" << endl;
    }
};

//Python页面
class Python:public BasePage
{
public:
    void content()
    {
        cout << "Python学科视频" << endl;
    }
};

//C语言页面
class C:public BasePage
{
public:
    void content()
    {
        cout << "C语言学科视频" << endl;
    }
};


void test1()
{
    Java ja;
    cout << "Java下载视频页面：" << endl;
    ja.header();
    ja.footer();
    ja.left();
    ja.content();

    cout << "-------------------------------------" << endl;
    Python py;
    cout << "Python下载视频页面：" << endl;
    py.header();
    py.footer();
    py.left();
    py.content();

    cout << "-------------------------------------" << endl;
    C c;
    cout << "C语言下载视频页面：" << endl;
    c.header();
    c.footer();
    c.left();
    c.content();
}


class X 
{
public:
    
    int i;

    X() { i = 1; }
    void set(int ii) { i = ii; }
    
    int read() const { return i;}
    
    int permute() { 
        return i = i * 47; 
    }
};

class Y : public X {
public:
    
    int i; // Different from X's i

    Y( ) { i = 2; }
    
    int change( ) { 
        i = permute(); // Different name
        return i; 
    }
    
    void set(int ii) { 
        i = ii;
        X::set(ii); 
    } // Same-name
};

void test2() {
    cout << "sizeof(X) = " << sizeof(X) << endl;// 4 存储了一个int
    cout << "sizeof(Y) = " << sizeof(Y) << endl;// 8 存储了两个int
    
    Y D; // X::i=1, Y::i=2
    D.change(); // return Y::i=47 (X::i=47)
    cout << "D.change():" << endl;
    cout << "Y::i = " << D.i << endl;
    cout << "X::i = " << D.X::i << endl;
    
    // X function interface comes through:
    // D中既有X::i，也有Y::i，基类中的方法，优先调用最近的那个i，也就是基类中的i
    D.read(); //X::i=47
    D.permute(); //X::i=47*47
    
    // Redefined functions hide base versions:
    D.set(12); // Y::i=12, X::i=12
}

int main()
{
    test1();
    cout << "================" << endl;
    test2();
    return 0;
}